package it.unicam.ids.pvm.postazione;

import it.unicam.ids.pvm.distributore.Lato;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * La classe rappresenta il nastro posto sotto l'espositore, 
 * che permette il passaggio di un prodotto da un lato 
 * all'altro di un distributore doppio. Contiene i 
 * seguenti attributi:
 * lato, il lato in cui il nastro è posto. 
 * @author Luca Iachini, Valerio Iachini, Alessandro Cardenà
 *
 */
public class Nastro {
	
	private Lato lato;
	
	/**
	 * Costruttore della classe.
	 * Inizializza il lato del nastro.
	 * @param lato.
	 */
	
	public Nastro(Lato lato){
		this.lato=lato;
	}
	
	/**
	 * Il metodo consente il movimento del nastro, 
	 * in modo da permettere il passaggio del prodotto.
	 */
	
	public void muovi() {
		try {
			fireEventInizio();
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Il metodo consente di termonare il 
	 * movimendo del nastro, una volta erogato 
	 * il prodotto.
	 */

	public void stop() {
		try {
			Thread.sleep(2000);
			fireEventStop();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private ArrayList<NastroEventListener> _listeners = new ArrayList<NastroEventListener>();

	/**
	 * Il metodo permette di aggiungere un gestore 
	 * dell'evento associato al nastro, alla lista.
	 * @param listener gestore dell'evento.
	 */
	
	public synchronized void addEventListener(NastroEventListener listener) {
		_listeners.add(listener);
	}
	
	/**
	 * Il metodo permette di togliere un gestore 
	 * dell'evento associato al nastro, dalla lista.
	 * @param listener gestore dell'evento.
	 */

	public synchronized void removeEventListener(NastroEventListener listener) {
		_listeners.remove(listener);
	}

	/**
	 * Il metodo consente di far partire l'evento 
	 * associato al movimento del nastro.
	 */
	
	private synchronized void fireEventInizio() {
		NastroEvent event = new NastroEvent(this,lato);
		Iterator<NastroEventListener> i = _listeners.iterator();
		while (i.hasNext()) {
			((NastroEventListener) i.next()).inizioMovimentoNastro(event);
		}
	}
	
	/**
	 * Il metodo consente di far terminare l'evento 
	 * associato al movimento del nastro.
	 */

	private synchronized void fireEventStop() {
		NastroEvent event = new NastroEvent(this,lato);
		Iterator<NastroEventListener> i = _listeners.iterator();
		while (i.hasNext()) {
			((NastroEventListener) i.next()).stopNastro(event);
		}
	}

}
